// receiver.cpp : Defines the entry point for the console application.
//

#ifdef _MSC_VER
#include "stdafx.h"
#endif

/*
* listener.c -- joins a multicast group and echoes all data it receives from
* the group to its stdout...
*
* Antony Courtney, 25/11/94
* Modified by: Fr�d�ric Bastien (25/03/04)
* to compile without warning and work correctly
*/
#include <Utility.h>

//LOCAL TEST 
#define HELLO_PORT 20000
#define HELLO_GROUP "225.0.0.37"

//REFRESH-X,A
//#define HELLO_PORT 10010
//#define HELLO_GROUP "233.72.75.142"

//REFRESH-X,B
//#define HELLO_PORT 10010
//#define HELLO_GROUP "233.72.75.206"

//SNAPSHOT-W, A
//#define HELLO_PORT 11010
//#define HELLO_GROUP "233.72.75.147"

//SNAPSHOT-W, B
//#define HELLO_PORT 11010
//#define HELLO_GROUP "233.72.75.211"

//SECURITY
//#define HELLO_PORT 12010
//#define HELLO_GROUP "233.72.75.149"

#define MSGBUFSIZE 1024*64
main(int argc, char *argv[])
{
struct sockaddr_in addr;
int fd, nbytes;
socklen_t addrlen;
struct ip_mreq mreq;
char msgbuf[MSGBUFSIZE];
u_int yes=1; 
int opt = 1;
int result = 0;
FIX::socket_init();
/*** MODIFICATION TO ORIGINAL */
/* create what looks like an ordinary UDP socket */
if ((fd=socket(AF_INET,SOCK_DGRAM,0)) < 0) {
perror("socket");
exit(1);
}
 
/**** MODIFICATION TO ORIGINAL */
/* allow multiple sockets to use the same PORT number */
if (setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,(const char*)&yes,sizeof(yes)) < 0) {
perror("Reusing ADDR failed");
exit(1);
}
/*** END OF MODIFICATION TO ORIGINAL */
/* set up destination address */
memset(&addr,0,sizeof(addr));
addr.sin_family=AF_INET;
addr.sin_addr.s_addr=htonl(INADDR_ANY); /* N.B.: differs from sender */
//addr.sin_addr.s_addr = (source_iface.empty() ? htonl(INADDR_ANY) : inet_addr(source_iface.c_str())); 
 

addr.sin_port=htons(HELLO_PORT);
/* bind to receive address */
if (bind(fd,(struct sockaddr *) &addr,sizeof(addr)) < 0) {
perror("bind");
exit(1);
}
/* use setsockopt() to request that the kernel join a multicast group */
mreq.imr_multiaddr.s_addr=inet_addr(HELLO_GROUP);
mreq.imr_interface.s_addr=htonl(INADDR_ANY);
if (setsockopt(fd,IPPROTO_IP,IP_ADD_MEMBERSHIP,(const char*)&mreq,sizeof(mreq)) < 0) {
perror("setsockopt");
exit(1);
}

FIX::socket_fionread( fd, opt );

/* now just enter a read-print loop */
while (1) 
{
	//FILE * f = fopen("C:\\DOCUMENTS AND SETTINGS\\C.GOLLAPUDI\\DESKTOP\\cmen.dat", "ab+");
	FILE * f = fopen(argv[1], "ab+");

	memset(msgbuf, 0, MSGBUFSIZE);
	fd_set readSet;
	FD_ZERO( &readSet );
	FD_SET( fd, &readSet );
	result = select( FD_SETSIZE, &readSet, NULL, NULL, 0 );
	if ( result != 0) 
	{
		addrlen=sizeof(addr);
		if ((nbytes=recvfrom(fd,msgbuf,MSGBUFSIZE,0,
		(struct sockaddr *) &addr,&addrlen)) < 0)
		{
			if (nbytes != -1)
			{
				perror("recvfrom");
				exit(1);
			}
		}
		if (nbytes != -1)
		{
			printf("%s", msgbuf);
			//puts(msgbuf);

			//ostream::write(fileno(f),msgbuf,sizeof(nbytes));

			//fwrite(msgbuf,sizeof(char), nbytes, f);
			//assert( nbytes == fwrite(msgbuf,sizeof(char), nbytes, f));
			fclose(f);
			//break;


		}


	}
	//fclose(f);
	//Sleep(100);
}



}
